package br.com.foxinline.manager.criar.ep;

import br.com.foxinline.enums.CategoriaPessoa;
import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.Cidade;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.TipoSelo;
import br.com.foxinline.modelo.ep.AtoTipoEP;
import br.com.foxinline.modelo.ep.Escritura;
import br.com.foxinline.modelo.ep.NaturezaEscritura;
import br.com.foxinline.modelo.ep.Parte;
import br.com.foxinline.modelo.ep.Qualidade;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.TipoSeloServico;
import br.com.foxinline.servico.ep.AtoTipoEPServico;
import br.com.foxinline.servico.ep.EscrituraServico;
import br.com.foxinline.servico.ep.NaturezaEscrituraServico;
import br.com.foxinline.servico.ep.QualidadeServico;
import br.com.foxinline.utilitario.AnexoUtilitario;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerCriarEscritura implements Serializable {
    
    @EJB
    EscrituraServico escrituraServico;
    @EJB
    AtoTipoEPServico atoTipoEPServico;
    @EJB
    NaturezaEscrituraServico naturezaEscrituraServico;
    @EJB
    QualidadeServico qualidadeServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    TipoSeloServico tipoSeloServico;

    private Escritura escritura;
    
    private Parte parte;    
    private List<Parte> partes;
    
    private SeloEP seloEP;    
    private List<SeloEP> selosEP;
    
    private List<Anexo> anexos;
    private AnexoUtilitario anexoUtilitario;
    
    private String editarId;
    
    
    @PostConstruct
    public void init() {
        instanciar();
        delegar();
    }

    private void instanciar() {
        this.escritura = new Escritura();

        this.parte =  new Parte();
        Pessoa pessoa = new Pessoa();
        pessoa.setTipoPessoa(TipoPessoa.FISICA);
        this.parte.setPessoa(pessoa);

        this.partes = new ArrayList<Parte>();

        this.seloEP = new SeloEP();
        this.selosEP = new ArrayList<SeloEP>();
        
        this.anexos = new ArrayList<Anexo>();
        this.anexoUtilitario = new AnexoUtilitario();
    }

    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.editarId = parametros.get("escrituraId");        
        
        if (editarId != null) {
            this.escritura = escrituraServico.pesquisar(Long.parseLong(editarId));
            this.partes = escrituraServico.obterPartes(this.escritura);
            this.selosEP = escrituraServico.obterSelos(this.escritura);
            this.anexos = escrituraServico.obterAnexos(this.escritura);
        }
    }

    public void salvar() throws IOException {        
        String mensagem;
        
        anexoUtilitario.gravarAnexos(this.anexos);
        
        this.escritura.setPartes(this.partes);
        this.escritura.setSelosEP(this.selosEP);
        this.escritura.setAnexos(this.anexos);
        
        if (this.escritura.getId() == null) {
            escrituraServico.salvar(this.escritura);
            mensagem = "Escritura cadastrada com sucesso!";
            instanciar();
        } else {
            escrituraServico.atualizar(this.escritura);
            mensagem = "Escritura atualizada com sucesso!";
        }

        Mensagem.messagemInfo(mensagem);
    }    
    
    public void adicionarParte() {
        
        this.parte.getPessoa().setCategoriaPessoa(CategoriaPessoa.CLIENTE);
        
        if (this.parte.getPessoa().getTipoPessoa() == TipoPessoa.FISICA && !this.parte.getPessoa().getCpf().isEmpty()) {
            this.parte.getPessoa().setCpf(Caracteres.removecaracter(this.parte.getPessoa().getCpf()));
        }
        
        if (this.parte.getPessoa().getTipoPessoa() == TipoPessoa.JURIDICA && !this.parte.getPessoa().getCnpj().isEmpty()) {
            this.parte.getPessoa().setCnpj(Caracteres.removecaracter(this.parte.getPessoa().getCnpj()));
        }        
        
        this.partes.add(this.parte);
        
        this.parte =  new Parte();
        Pessoa pessoa = new Pessoa();
        pessoa.setTipoPessoa(TipoPessoa.FISICA);
        this.parte.setPessoa(pessoa);
    }
    
    public void limparParte() {
        this.parte =  new Parte();
        Pessoa pessoa = new Pessoa();
        pessoa.setTipoPessoa(TipoPessoa.FISICA);
        this.parte.setPessoa(pessoa);        
    }
    
    public void editarParte(Parte parte) {
        this.parte = parte;
        this.partes.remove(parte);
    }
    
    public void removerParte(Parte parte) {
        this.partes.remove(parte);
    }
    
    public void adicionarSeloEP() {
        this.selosEP.add(this.seloEP);
        
        this.seloEP =  new SeloEP();
    }
    
    public void limparSeloEP() {
        this.seloEP =  new SeloEP();
    }
    
    public void editarSeloEP(SeloEP seloEP) {
        this.seloEP = seloEP;
        this.selosEP.remove(seloEP);
    }
    
    public void removerSeloEP(SeloEP seloEP) {
        this.selosEP.remove(seloEP);
    }

    public void limparNatureza() {
        this.escritura.setNaturezaEscritura(new NaturezaEscritura());
    }
    
    public void adicionarAnexo(FileUploadEvent event) {

        try {
            this.anexos.add(anexoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        } catch (SQLException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        } catch (IOException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        }

    }    

    public void removerAnexo(Anexo a) {
        try {
            anexoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            this.anexos.remove(a);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
    
    public List<AtoTipoEP> autocompletarAtoTipoEP(String query) {
        return atoTipoEPServico.autocompletarAtoTipoCEP(query);
    }

    public List<NaturezaEscritura> autocompletarNaturezaEscritura(String query) {
        return naturezaEscrituraServico.autocompletar(query, this.escritura.getAtoTipoEP());
    }

    public List<Qualidade> autocompletarQualidade(String query) {
        return qualidadeServico.autocompletar(query, this.escritura.getAtoTipoEP());
    }

    public List<Cidade> autocompletarCidade(String query) {
        return cidadeServico.autocompletar(query);
    }

    public List<TipoSelo> autocompletarTipoSelo(String query) {
        return tipoSeloServico.autocompletar(query);
    }    
    
    public String adicionarMascaraCNPJ(String string) {
        return  Caracteres.adicionarMascara(string, Caracteres.cnpjMask);
    }

    public String adicionarMascaraCPF(String string) {
        return  Caracteres.adicionarMascara(string, Caracteres.cpfMask);
    }

    public Escritura getEscritura() {
        return escritura;
    }

    public void setEscritura(Escritura escritura) {
        this.escritura = escritura;
    }

    public Parte getParte() {
        return parte;
    }

    public void setParte(Parte parte) {
        this.parte = parte;
    }

    public List<Parte> getPartes() {
        return partes;
    }

    public void setPartes(List<Parte> partes) {
        this.partes = partes;
    }

    public SeloEP getSeloEP() {
        return seloEP;
    }

    public void setSeloEP(SeloEP seloEP) {
        this.seloEP = seloEP;
    }

    public List<SeloEP> getSelosEP() {
        return selosEP;
    }

    public void setSelosEP(List<SeloEP> selosEP) {
        this.selosEP = selosEP;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }

}
